关于8086的"段"(对段深入理解的高手请指教)

来源:百度知道 编辑:UC知道 时间:2024/06/08 02:49:34
在8086的实模式下,把某一段寄存器左移4位,然后与地址ADDR相加后被直接送到内存总线上,这个相加后的地址就是内存单元的物理地址。
8086处理器的寻址目标是1M大的内存空间,于是它的地址总线扩展到了20位。但是,一个问题摆在了Intel设计人员面前,虽然地址总线宽度是20位的,但是CPU中“算术逻辑运算单元(ALU)”的宽度,即数据总线却只有16位,也就是可直接加以运算的指针长度是16位的。如何填补这个空隙呢?
为了支持分段,Intel在8086 CPU中设置了四个段寄存器:CS、DS、SS和ES,分别用于可执行代码段、数据段、堆栈段及其他段。每个段寄存器都是16位的,对应于地址总线中的高16位。每条“访内”指令中的内部地址也都是16位的,但是在送上地址总线之前,CPU内部自动地把它与某个段寄存器中的内容相加。因为段寄存器中的内容对应于20位地址总线中的高16位(也就是把段寄存器左移4位),所以相加时实际上是内存总线中的高12位与段寄存器中的16位相加,而低4位保留不变,这样就形成一个20位的实际地址,也就实现了从16位内存地址到20位实际地址的转换,或者叫“映射”。
上面是陈莉君前辈在linux的相关教程里提到的8086的分段机制,上面第一段话说是:“某一段寄存器左移4位”,这里“左移4位”不是很明白,好像在上面第三段话里给出了解释:“因为段寄存器中的内容对应于20位地
址总线中的高16位(也就是把段寄存器左移4位),所以相加时实际上是内存总线中的高12位与段寄存器中的16位相加,而低4位保留不变,”从体系结构的层次来说,8086是为了解决数据总线16位和地址总线20位的矛盾才在8080的基础上引入了分段机制,而现在pentium时代段的概念没有那么凸现,看了上面就8086如何从硬件层次实现左移4位觉得还是糊里糊涂,请老高手从体系结构层次(底层)指点一下……

补充:有朋友这样给出一个回答:(十分感谢!)
左移4位是指二进制下左移4位,相当于十六进制下左移一位,也就是乘以10H,打个比方就明白了。
DS=(2000H),BX=(1000H),所以段地址就是2000H,段内偏移就是1000H
2000H左移4位(二进制下),就是20000H,加上段内偏移1000H,

老兄,你学什么专业的,你学过数字电路没???学过那个,你就知道芯片的秘密了,CPU怎么移位,你也就能有个了解了(至少我现在有我自己的理解).
反正你问的问题我明白怎么回事,你要么没学过数字电路,要么就是学完都还给老师了,你自己的事,想学硬件的话数字电路是必须学的.你问的问题就有点太靠近硬件了(应该说就是硬件的问题).
10分,还不一定给我,如果我刚来这回答问题的时候也许我会好好的回答,但现在,想给你解释清楚,我得打N多字,不值.你知道地址是怎么算出来的就可以了,还有就是其他几种寻址方式,至于计算机怎么实现的,给你个建议,要么去看数字电路,要么放弃这个问题,8086已经过时,这问题对你没什么太大帮助,除非你搞硬件,这样的话你就得学数字电路.
这位兄弟,我不是啥高手,也是个在校学生,估计咱俩年纪差不多,我是85年的,现在大三.我看你是新注册的才回答你这个问题,怕没人回答你的问题,你对知道失去信心.分我不想要,我只是心里不舒服,就那么一说.
我现在很烦,举个例子,当初刚接触计算机的时候,杀毒我用杀毒软件,一年过去了,现在能手杀的我都手杀,可我其他同学依旧用杀毒软件.这样一来,同样是病毒问题,都能解决,也就没什么区别了,那么当初我辛苦的查进程,学习注册表,还有什么意义????到头来,他们拿多余的时间去玩,去恋爱,去赚钱,而我却找地方一个人看书,还不知道我有什么价值,我郁闷.现在在这里,很多问题我可以解决(但有更是多我解决不了的),但我就不爱回答了,我就挑一些没人回答的和有高分的回答,图个心里平衡.
咱俩一个专业的,我学校成绩一般,有空可以多交流交流,学无止境.